#include <sc8f083.h>  // SC8F083头文件
 
/* 硬件连接定义 - SOP8封装 */
#define TX_PIN  RB0     // 发送引脚RB0（SOP8封装）
#define RX_PIN  RB1     // 接收引脚RB1（SOP8封装）
 
/* 全局变量 */
volatile unsigned int timer_count = 0;
volatile unsigned char timer_flag = 0;
unsigned int timer_interval = 500;  // 默认2秒间隔（500次中断）
 
/* 函数声明 */
void System_Init(void);
void UART_Init(void);
void Timer2_Init(void);
void Timer2_SetInterval(unsigned int seconds);  // 设置定时间隔函数
void UART_SendByte(unsigned char dat);
void UART_SendString(const char *s);
unsigned char UART_ReceiveByte(void);
 
 
void DelayXms(unsigned char x)
{
	unsigned char i,j;
	for(i=x;i>0;i--)
		for(j=153;j>0;j--);
}
 
/* 主函数 */
void main(void)
{
    System_Init();  // 系统初始化
    UART_Init();    // 串口初始化
    Timer2_Init();  // 定时器初始化
    
    Timer2_SetInterval(1);  // 设置为1秒间隔
    
    UART_SendString("SC8F083 Ready\r\n");  // 发送启动信息
    
    while(1)
    {
        // 接收检测（查询方式）
        if(RCIF) 
        {
            unsigned char received = UART_ReceiveByte();
            
            // 简单回显接收到的字符
            UART_SendByte(received);
        }
        
        // 定时上报简单字符串
        if(timer_flag)
        {
            timer_flag = 0;
            UART_SendString("SC8F083 OK\r\n");  // 简单上报字符串
        }
        
        asm("CLRWDT");  // 清除看门狗
    }
}
 
/* 系统初始化 */
void System_Init(void)
{
    // 基本配置
    asm("CLRWDT");
    OSCCON = 0x70;      // 8MHz内部振荡器
    OPTION_REG = 0x00;  // 配置选项寄存器
    INTCON = 0x00;      // 初始化中断控制
    
    // 配置TX/RX引脚 - SOP8封装
    TRISB0 = 0;  // RB0作为输出（TX）
    TRISB1 = 1;  // RB1作为输入（RX）
}
 
/* 串口初始化 (9600bps @8MHz) */
void UART_Init(void)
{
    // 引脚功能重映射 - SOP8封装
    TRISB0 = 0;  // RB0作为输出（TX）
	TRISB1 = 1;  // RB1作为输入（RX）
    
    // 串口控制寄存器配置
    //TXSTA = 0x24;  // 8位发送，使能发送，异步模式
    //RCSTA = 0x90;  // 使能串口，8位接收
 
	TXSTA =  0B10100000;		//主控模式，8位数据，异步模式，
 
	RCSTA =  0B10010000;		//使能串口，使能接收
	//51,波特率为19200 是可以的；
	SPBRG =  103;        		 //波特率9600，目标波特率=FOSC/16([SPBRG]+1)
    
    // 中断配置（可选）
    RCIE = 1;      // 使能接收中断
    PEIE = 1;      // 使能外设中断
    GIE = 1;       // 全局中断使能
}
 
/* 发送单字节 */
void UART_SendByte(unsigned char dat)
{
    while(!TXIF);  // 等待发送缓冲区空
    TXREG = dat;   // 写入发送寄存器
}
 
/* 发送字符串 */
void UART_SendString(const char *s)
{
    while(*s) {
        UART_SendByte(*s++);
    }
}
 
/* 接收单字节（带错误检测） */
unsigned char UART_ReceiveByte(void)
{
    if(OERR) {     // 检查溢出错误
        CREN = 0;  // 必须先禁用接收
        CREN = 1;  // 重新使能接收
    }
    if(FERR) {     // 检查帧错误
        unsigned char dummy = RCREG; // 读取清除错误
        (void)dummy;
    }
    return RCREG;  // 返回有效数据
}
 
/* 定时器2初始化 - 基础配置 */
void Timer2_Init(void)
{
    // 基础定时器配置（固定4ms中断周期）
    // 16MHz系统时钟（芯片默认），TMR2时钟源 = FOSC/4 = 4MHz
    // 预分频1:4，后分频1:16
    // TMR2计数周期 = 1/(4MHz/4) = 1us
    // PR2 = 249，定时周期 = (249+1) * 1us * 16 = 250 * 1us * 16 = 4000us = 4ms
    
    PR2 = 249;          // 周期寄存器
    TMR2 = 0;          // 清零计数器
    TMR2IF = 0;        // 清除中断标志
    TMR2IE = 1;        // 使能TMR2中断
    
    // T2CON配置：预分频1:4，后分频1:16，开启TMR2
    // 0B01111101 = 后分频1:16(1111)，预分频1:4(01)，开启TMR2(1)
    T2CON = 0B01111101; // 后分频1:16(1111)，预分频1:4(01)，开启TMR2(1)
    
    // 按照官方例程的中断使能方式
    INTCON = 0XC0;     // 开启总中断及外设中断
    
    // 默认设置为2秒间隔
    timer_interval = 500;  // 500 * 4ms = 2000ms = 2秒
}

/* 设置定时器间隔函数 */
void Timer2_SetInterval(unsigned int seconds)
{
    // 计算需要的中断次数
    // 每次中断4ms，1秒需要1000ms/4ms = 250次中断
    timer_interval = seconds * 250;
    
    // 重置计数器
    timer_count = 0;
    timer_flag = 0;
}

/* 中断服务程序 */
void interrupt Timer_Isr(void)
{
    // TMR2中断处理
    if(TMR2IF)
    {
        TMR2IF = 0;    // 清除中断标志
        
        timer_count++;
        
        // 根据设置的间隔触发定时器
        if(timer_count >= timer_interval)
        {
            timer_count = 0;
            timer_flag = 1;
        }
    }
    
    // UART接收中断处理
    if(RCIF)
    {
        RCIF = 0;      // 清除中断标志
    }
}